
namespace FastFood.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
	using System.Data.Common;
	using Microsoft.Practices.EnterpriseLibrary.Data;
	using EDOSwit.Entity;
	using FastFood.Business.Entities;

	/// <summary>
	/// Represents the DataAccess of Productos_InsumosData.
	/// </summary>
	public class Productos_InsumosData : Singleton<Productos_InsumosData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

		#region Methods

		/// <summary>
		/// Selects all records from the Productos_Insumos table by a foreign key.
		/// </summary>
		public Productos_Insumos Obtener(short productoID, short insumoID)
		{
			var productos_Insumos = default(Productos_Insumos);
			var comando = BaseDatos.GetStoredProcCommand("SelectProductos_Insumos");

			BaseDatos.AddInParameter(comando, "productoID", DbType.Int16, productoID);
			BaseDatos.AddInParameter(comando, "insumoID", DbType.Int16, insumoID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					productos_Insumos = new Productos_Insumos
					{
						productoID = lector.IsDBNull(lector.GetOrdinal("productoID"))? default(short) : lector.GetInt16(lector.GetOrdinal("productoID")),
						insumoID = lector.IsDBNull(lector.GetOrdinal("insumoID"))? default(short) : lector.GetInt16(lector.GetOrdinal("insumoID")),
						cantidad = MathExpression.Round(Convert.ToSingle(lector.GetValue(lector.GetOrdinal("cantidad"))))
					};
				}
			}
			comando.Dispose();
			return productos_Insumos;
		}

		/// <summary>
		/// Saves a record to the Productos_Insumos table.
		/// </summary>
        public int Agregar(short productoID, Productos_Insumos productos_Insumos, DbTransaction transaccion)
		{
			var comando = BaseDatos.GetStoredProcCommand("InsertProductos_Insumos");
			BaseDatos.AddInParameter(comando, "productoID", DbType.Int16, productoID);
			BaseDatos.AddInParameter(comando, "insumoID", DbType.Int16, productos_Insumos.insumoID);
			BaseDatos.AddInParameter(comando, "cantidad", DbType.Double, MathExpression.Round(productos_Insumos.cantidad));

			var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
			if (resultado == 0) throw new Exception("Error al Agregar Productos_Insumos.");

			comando.Dispose();
			return 1;
		}

		/// <summary>
		/// Updates a record in the Productos_Insumos table.
		/// </summary>
        public bool Modificar(Productos_Insumos productos_Insumos, DbTransaction transaccion)
		{
			var comando = BaseDatos.GetStoredProcCommand("UpdateProductos_Insumos");
			BaseDatos.AddInParameter(comando, "productoID", DbType.Int16, productos_Insumos.productoID);
			BaseDatos.AddInParameter(comando, "insumoID", DbType.Int16, productos_Insumos.insumoID);
			BaseDatos.AddInParameter(comando, "cantidad", DbType.Single, MathExpression.Round(productos_Insumos.cantidad));

			var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
			if (resultado == 0) throw new Exception("Error al Modificar Productos_Insumos.");

			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the Productos_Insumos table by its primary key.
		/// </summary>
		public bool Eliminar(short productoID, short insumoID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteProductos_Insumos");
			BaseDatos.AddInParameter(comando, "productoID", DbType.Int16, productoID);
			BaseDatos.AddInParameter(comando, "insumoID", DbType.Int16, insumoID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Productos_Insumos.");
			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the Productos_Insumos table by a foreign key.
		/// </summary>
		public void EliminarPorInsumoID(short insumoID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteProductos_InsumosByInsumoID");
			BaseDatos.AddInParameter(comando, "insumoID", DbType.Int16, insumoID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Productos_Insumos.");
			comando.Dispose();
		}

		/// <summary>
		/// Deletes a record from the Productos_Insumos table by a foreign key.
		/// </summary>
        public void EliminarPorProductoID(short productoID, DbTransaction transaccion)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteProductos_InsumosByProductoID");
			BaseDatos.AddInParameter(comando, "productoID", DbType.Int16, productoID);

			var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
			if (resultado == 0) throw new Exception("Error al Eliminar Productos_Insumos.");
			comando.Dispose();
		}

		/// <summary>
		/// Selects all records from the Productos_Insumos table by a foreign key.
		/// </summary>
		public IList<Productos_Insumos> ListarPorInsumoID(short insumoID)
		{
			var entidades = new List<Productos_Insumos>();
			var comando = BaseDatos.GetStoredProcCommand("SelectProductos_InsumosByInsumoID");

			BaseDatos.AddInParameter(comando, "insumoID", DbType.Int16, insumoID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new Productos_Insumos
					{
						productoID = lector.IsDBNull(lector.GetOrdinal("productoID"))? default(short) : lector.GetInt16(lector.GetOrdinal("productoID")),
						insumoID = lector.IsDBNull(lector.GetOrdinal("insumoID"))? default(short) : lector.GetInt16(lector.GetOrdinal("insumoID")),
                        cantidad = MathExpression.Round(Convert.ToSingle(lector.GetValue(lector.GetOrdinal("cantidad"))))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the Productos_Insumos table by a foreign key.
		/// </summary>
		public IList<Productos_Insumos> ListarPorProductoID(short productoID)
		{
			var entidades = new List<Productos_Insumos>();
			var comando = BaseDatos.GetStoredProcCommand("SelectProductos_InsumosByProductoID");

			BaseDatos.AddInParameter(comando, "productoID", DbType.Int16, productoID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new Productos_Insumos
					{
						productoID = lector.IsDBNull(lector.GetOrdinal("productoID"))? default(short) : lector.GetInt16(lector.GetOrdinal("productoID")),
						insumoID = lector.IsDBNull(lector.GetOrdinal("insumoID"))? default(short) : lector.GetInt16(lector.GetOrdinal("insumoID")),
                        cantidad = MathExpression.Round(Convert.ToSingle(lector.GetValue(lector.GetOrdinal("cantidad"))))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		#endregion
	}
}
